const Service = require('egg').Service;

class userService extends Service {
  async getUserAttribute() {
    const { ctx } = this;
    const user = ctx.model.User.findByPk(ctx.session.user.id);
    const userInfo = user.getUserInfo();
    //todo 用户拿到他对应的所有角色
    const roles = await user.getRoles().map(item => {
      //fixme ???
      delete item.user_role;
      return item;
    });
    const rights = [];
    for (const role of roles) {
      //todo role.getRights()角色再查到其所有对应的权限
      // .concat concat() 方法用于连接两个或多个数组。 该方法不会改变现有的数组，而仅仅会返回被连接数组的一个副本。
      const tempRights = await role.getRights();
      rights.concat(tempRights);
      //fixme??? 做什么
      for (const right of tempRights) {
        /*todo some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
注意：如果用一个空数组进行测试，在任何情况下它返回的都是false。*/
        if (!rights.some(item => item.id === right.id)) {
          delete right.role_role;
          //fixme ???
          right.get({
            plain: true
          });
          rights.push(right);
        }
      }
    }
    for (const role of roles) {
      role.get({
        plain: true
      });
    }

    return {
      userInfo,
      roles,
      rights
    };
  }
}

module.exports = userService;
